<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    //函数声明、参数（形参、实参）（argument）。返回值
    //函数表达式、弥明函数。立即执行函数
    //回调函数 、递归函数
    //函数可以作为其他函数的返回值进行 返回（返回的函数要进行调用，如果不调用返回将是一个函数声明的整个内容）
    function fn1(a,b){
        console.log('fn1函数调用');
        return a+b ;
    }
    let fn2 =function(f){
        console.log('fn2函数调用');
        return f;
    }
    console.log(fn2(fn1(3,3)));  //先执行 17行 在  21  -- 24 
    console.log(fn1(1,2))

    console.log('-------------------1');
    //作用域 ：作用的范围
    
    /*
    js 的运行分两的部分 ： 
    1.解析（编译）：语法检查、声明变量和函数
    2.执行 ：对变量进行赋值、按照执行顺序进行执行
    var 和 let 的区别 ：
    1.var 和 let 声明变量 ：var可以先使用再声明 ，let 不允许。var 有声明提升 ，let声明提升后执行时会出现暂时性死区，因此会报错
    2.var 在同一个作用域 内声明的变量名可以相同，而let不允许
    3.var 和 let 都 全局作用域 和  局部作用域 （函数作用域），在let 中增加了一个快作用域
    推荐使用let (ES6),是我们的代码更加严儆神
    
    */
//    console.log(num1);
   console.log(num2);  //1.var 2. c.1() 3.num2=10 
   let num1;   //先声明才能调用
   var num2=10;  //可以先使用在声明，在调用
   console.log('------------');
   //全局作用域 ：全局变量
   let a =1;
   let b =2;
   function myf(){
    //局部作用域 (函数作用域) ：局部变量
    let c =3;
    let d =4;
    console.log(a);
    console.log(b);
    console.log(c);
    console.log(d);
   }
   myf();
    console.log(a);
    console.log(b);
    // console.log(c);  //报错
    // console.log(d); //报错
    console.log('---------块作用域--------------------');
    //在let 中增加了一块作用域 {}
    for(let i=0;i<3;i++){
        console.log('i:'+i);
    }
    // console.log(i); // 报错 ：离开了块作用域
    for(var j=0;j<3;j++){
        console.log('j:'+j);
    }
    console.log(j);

    console.log('---------作用域链----');
    //执行上下文：执行js代码的环境
    //栈的结构 ：先进后出
    let g = 10;
    function fn3(){
        let h = 'hello';
        function fn4(){
            let k =true;
            console.log(a);
            console.log(b);
            console.log(c);
        }
        fn4();
    }
    fn3();


</script>
</html>